package com.example.design.patterns.冰河.行为模式.访问者模式.concreteVisitor;

import com.example.design.patterns.冰河.行为模式.访问者模式.concreteElement.FloatElement;
import com.example.design.patterns.冰河.行为模式.访问者模式.concreteElement.StringElement;
import com.example.design.patterns.冰河.行为模式.访问者模式.element.visitable;
import com.example.design.patterns.冰河.行为模式.访问者模式.visitor.Visitor;
import java.util.Collection;
import java.util.Iterator;

/**
 * ConcreteVisitor实现每个由Visitor声明的操作。每个操作实现本算法的一部分，而该算法片断乃
 * 是对应于结构中对象的类。ConcreteVisitor为该算法提供了上下文并存储它的局部状态。这一状
 * 态常常在遍历该结构的过程中累积结果。
 */
public class ConcreteVisitor implements Visitor {
    /**
     *
     * @param stringElement
     */
    @Override
    public void visitString(StringElement stringElement) {
        System.out.println(stringElement.getString());
    }

    /**
     *
     * @param floatElement
     */
    @Override
    public void visitFloat(FloatElement floatElement) {
        System.out.println(floatElement.getAFloat());
    }

    /**
     *
     * @param collection
     */
    @Override
    public void visitCollection(Collection collection) {
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
            Object o = iterator.next();
            if (o instanceof visitable) {
                ((visitable) o).accept(this);
            }
        }
    }
}
